1
L'écart de performance : Pourquoi étendre NumPy ?
AI018Lesson 5
00:00

Bien que NumPy soit basé sur C, certains algorithmes intensifs en calcul atteignent une barrière de vectorisation. Cela se produit lorsque la latence intrinsèque de la nature dynamique de Python dépasse les avantages de l'abstraction de haut niveau.

1. La taxe d'interpréteur et l'emballage

Chaque itération dans une boucle Python standard implique un contrôle de type dynamique et un comptage de références. Même en utilisant des scalaires NumPy, l'« emballage » des données brutes C dans des objets Python crée un goulot d'étranglement majeur pour des fonctions comme $\text{logit}(p) = \log(p/(1-p))$. Gérer les cas limites en C est nettement plus rapide :

>>> logit(0) -> -inf
>>> logit(1) -> inf
>>> logit(2) -> nan
>>> logit(-2) -> nan

2. Surcharge des tableaux intermédiaires

Les expressions pures NumPy créent des tampons mémoire temporaires pour chaque opération secondaire. En étendant via l'API C, il est possible d'effectuer fusion de noyaux, où la transformation logit est calculée en une seule passe sans surcharge mémoire auxiliaire.

3. Dépendances spatiales

Opérations impliquant des motifs d'accès aux voisins, tels que le stencil 2D :

$$B(I, J) = A(I, J) + (A(I-1, J) + A(I+1, J) + A(I, J-1) + A(I, J+1)) \cdot 0.5D0 + (A(I-1, J-1) + A(I-1, J+1) + A(I+1, J-1) + A(I+1, J+1)) \cdot 0.25D0$$

sont difficiles à exprimer efficacement par découpage sans copier inutilement la mémoire. Les extensions C permettent un calcul direct à l'aide de pointeurs alignés sur le cache.

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>